classdef Fast_cluster
    %UNTITLED2 此处提供此类的摘要
    %   此处提供详细说明

    properties
        X_data;%输入数据
        class_num; %类别数目
        Center; % 各类中心
        class_label; %类别标签
    end

    methods
        function obj = Fast_cluster(inputArg1,inputArg2)
            %UNTITLED2 构造此类的实例
            %   此处提供详细说明
            obj.X_data = inputArg1 ;
            obj.class_num = inputArg2;
        end

        function obj = fit(obj)
            %METHOD1 此处提供此方法的摘要
            %   1.随机选取class_num个聚类中心
            %   2. 计算距离
            %%% 初始选择聚类中心
            [n_sample, dim] = size(obj.X_data);
            label = zeros(n_sample,1); % 类别标签初始化
            ind = randperm(n_sample); % 随机排列后的index
            fenge = floor(n_sample / obj.class_num);
            center = zeros(obj.class_num, dim);%临时存放中心
            for i = 1 : obj.class_num
                if i < obj.class_num
                    center(i,:) = mean( obj.X_data(ind( (i-1)*fenge + 1 : i*fenge),:), 1);
                    label(ind( (i-1)*fenge + 1 : i*fenge)) = i;
                else
                    center(i,:) = mean(obj.X_data(ind( (i-1)*fenge + 1 : end),:), 1);
                    label(ind( (i-1)*fenge + 1 : end)) = i;
                end
            end
            figure
            scatter(obj.X_data(:,1), obj.X_data(:,2),10,label,"filled")
            
            step = 10; %聚类计算10次
            while step>0
                for i = 1:n_sample
                    D = zeros(1, obj.class_num); %每个点到聚类中心的距离
                    for j = 1:obj.class_num
%                         disp([step, i, j])
%                         disp(obj.X_data(i,:))
%                         disp(center(j,:))
                        D(j) = pdist([obj.X_data(i,:); center(j,:)]);
                    end
                    [~,ind] = min(D); %找到改点距离哪个点距离最近，找到其索引
                    label(i) = ind; 
                end
                center = comput_center(obj, label) %更新聚类中心
              
                scatter(obj.X_data(:,1), obj.X_data(:,2),10,label,"filled")
                step = step -1;
            end
            obj.class_label= label;
            obj.Center = center;
            
        end
        
%         function new_center = comput_center(obj, label)
%             %传入新的分组，计算他们的聚类中心
%             for i = 1:obj.class_num
%                 new_center(i,:) = mean(obj.X_data(label == i), 1);
%             end
%         end

    end
end